<?php
// 被动公众平台接口
$wx=new Wx();

class Wx{
    // token钥匙
    private const TOKEN = 'weixin';
	private $obj;
	private $config;
    // 构造方法，第一次是get方式提交就配置，如果是被动回复，用户发过来消息，那么就是post方法
    function __construct(){
        if($_GET["echostr"]){
            echo $this->checkSignature();
        }else{
			// 接收配置里面的数据
			$this->config=include 'config.php';
            // 接受消息
            $this->acceptMesage();
        }
    }

    // 接收消息处理
    private function acceptMesage(){
        // 获取公众平台发送过来的xml数据
        $xml=file_get_contents('php://input');
        // 写接收日志方法
        $this->writeLog($xml);
        // 把xml转化为对象格式
        $this->obj=simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
        // 消息类型判断
		$type=$this->obj->MsgType;
		$msg='';
		// 动态方法，
		$funName=$type.'Fun';
		echo $msg=$this->$funName();
		// 如果有数据则记录日志
		if(!empty($msg)){
			$this->writeLog($msg,1);
		}
	}
	
	// 接收为文本文字内容
	private function textFun(){
		// 接收用户发来的数据
		$content=(string)$this->obj->Content;
		// 判断关键字
		if(stristr($content,'图文-')){
			$content='图文-----------';
		}
		// echo 返回数据给公众号服务
		echo $this->text($content);
	}

	// 接收为图片内容
	private function imageFun(){
		// 接收用户发来的数据
		$content=(string)$this->obj->Content;
		// 判断关键字
		if(stristr($content,'图文-')){
			$content='图文-----------';
		}
		// echo 返回数据给公众号服务器
		echo $this->image();
	}

	// 文本文字回复
	private function text(string $content){
		return $msg=sprintf($this->config['text'],$this->obj->FromUserName,$this->obj->ToUserName,time(),"服务器：".$content);
	}
	// 图片回复
	private function image(){
		return $msg=sprintf($this->config['image'],$this->obj->FromUserName,$this->obj->ToUserName,time(),$this->obj->MediaId);
	}

    // 日志
    private function writeLog(string $xml,int $flog=0){
        $title=$flag==0 ? '接收' : '发送';
        $dtime=date('Y年m月d日 H:i:s');

        // 日志内容
        $log=$title."【{$dtime}】\n";
        $log.="------------------------------------------------------------------------------------------\n";
        $log.=$xml."\n";
        $log.="------------------------------------------------------------------------------------------\n";

        // 写日志
        file_put_contents('weixin.xml',$log,FILE_APPEND);
    }

    // 配置，第一次连接
    function checkSignature(){

        $signature=$_GET["signature"];
        $timestamp=$_GET["timestamp"];
        $nonce=$_GET["nonce"];
        $echostr=$_GET["echostr"];

        $tmpArr['token']=self::TOKEN;
        $tmpArr['timestamp']=$timestamp;
        $tmpArr['nonce']=$nonce;

        // 进行字典
        sort($tmpArr,SORT_STRING);
        // 拼接成字符串
        $tmpStr=implode($tmpArr);
        // 进行sha1加密
        $tmpStr=sha1($tmpStr);

        // 验证通过
        if($tmpStr==$signature){
            return $echostr;
        }
        // 验证不通过
        return ' ';
    }
}